package Entorno;

import javax.swing.SwingUtilities;

import Servidor.ServidorEnTierra;
import Utilidades.GUI_PanelDeRadar;
import Misil.MisilEnemigo;
import Radar.Radar;

/**
 * @brief Clase que crea los objetos e hilos necesarios para poner en marcha el
 *        programa.
 * @author Marcelo
 * 
 */
public class Aplicacion {
	static int puerto = 15001; // puerto para los sockets

	public static void main(String[] args) throws InterruptedException {

		Entorno entorno = new Entorno();
		Radar radar = new Radar(entorno, puerto);
		ServidorEnTierra servidor = new ServidorEnTierra(entorno.getBaterias(),puerto);

		generarEnemigoConvenientemente(entorno);

		// Interfaz Grafica
		SwingUtilities.invokeLater(new GUI_PanelDeRadar(entorno));

		int tiempo = entorno.getTime();
		while (true) {
			tiempo = pasarElTiempo(entorno, radar, servidor, tiempo);
			if (tiempo % 10 == 0) {
				radar.detectarYEnviar();
				servidor.procesarDatosRadar();
			}

			if (tiempo % 24 == 0) {
				entorno.generarMisilEnemigo();
			}
			if (tiempo == 25) {
				generarEnemigoConvenientemente(entorno);
			}
		}
	}

	/**
	 * @brief Funcion que se encarga de que transcurra el tiempo
	 * @param entorno
	 * @param radar
	 * @param servidor
	 * @param tiempo
	 * @return
	 * @throws InterruptedException
	 */
	public static int pasarElTiempo(Entorno entorno, Radar radar,
			ServidorEnTierra servidor, int tiempo) throws InterruptedException {
		printTiempo(tiempo);
		entorno.pasarTiempo();
		Thread.sleep(250);// Cambiar el 500 por 1000 para que sea 1seg
		tiempo++;
		// tiempo=entorno.getTime();
		if (tiempo % 8 == 0) {
			radar.scan();
		} // Cada 4 segundos el radar escanea el entorno
		return tiempo;
	}

	/**
	 * @brief Funcion que muestra el tiempo en formato de minutos y segundos
	 * @param tiempo
	 */
	private static void printTiempo(long tiempo) {
		int segundos = (int) tiempo % 60;
		int minutos = (int) (tiempo - (tiempo % 60)) / 60;
		if (minutos == 100) {
			tiempo = 0;
			segundos = 0;
		}

		if (minutos < 10)
			System.err.print("\n[0" + minutos);
		else
			System.err.print("\n[" + minutos);

		if (segundos < 10)
			System.err.print(":0" + segundos + "]  ");
		else
			System.err.print(":" + segundos + "]  ");

	}

	/**
	 * @brief Funcion que genera cuatro enemigos que pegan en el area protegida
	 * @param entorno
	 */
	private static void generarEnemigoConvenientemente(Entorno entorno) {
		// Enemigo 1
		double[] ubicacionEnemigo1 = new double[3];
		ubicacionEnemigo1[0] = -20163;
		ubicacionEnemigo1[1] = -45755;
		ubicacionEnemigo1[2] = 3889;
		MisilEnemigo enemy1 = (MisilEnemigo) entorno.generarMisilEnemigo(
				ubicacionEnemigo1, 86);
		double[] velocidadEnemigo1 = new double[3];
		velocidadEnemigo1[0] = 43;
		velocidadEnemigo1[1] = 95;
		velocidadEnemigo1[2] = -10;
		enemy1.getComportamiento().setVectorDeVelocidad(velocidadEnemigo1);

		// Enemigo 2
		double[] ubicacionEnemigo2 = new double[3];
		ubicacionEnemigo2[0] = -46000;
		ubicacionEnemigo2[1] = 10000;
		ubicacionEnemigo2[2] = 5000;
		MisilEnemigo enemy2 = (MisilEnemigo) entorno.generarMisilEnemigo(
				ubicacionEnemigo2, 86);
		double[] velocidadEnemigo2 = new double[3];
		velocidadEnemigo2[0] = 46;
		velocidadEnemigo2[1] = -10;
		velocidadEnemigo2[2] = -5;
		enemy2.getComportamiento().setVectorDeVelocidad(velocidadEnemigo2);

		// Enemigo 3
		double[] ubicacionEnemigo3 = new double[3];
		ubicacionEnemigo3[0] = 43464;
		ubicacionEnemigo3[1] = -24717;
		ubicacionEnemigo3[2] = 2220;
		MisilEnemigo enemy3 = (MisilEnemigo) entorno.generarMisilEnemigo(
				ubicacionEnemigo3, 81);
		double[] velocidadEnemigo3 = new double[3];
		velocidadEnemigo3[0] = -70;
		velocidadEnemigo3[1] = 44;
		velocidadEnemigo3[2] = -4;
		enemy3.getComportamiento().setVectorDeVelocidad(velocidadEnemigo3);

		// Enemigo 4
		double[] ubicacionEnemigo4 = new double[3];
		ubicacionEnemigo4[0] = 20163;
		ubicacionEnemigo4[1] = -45754;
		ubicacionEnemigo4[2] = 2220;
		MisilEnemigo enemy4 = (MisilEnemigo) entorno.generarMisilEnemigo(
				ubicacionEnemigo4, 120);
		double[] velocidadEnemigo4 = new double[3];
		velocidadEnemigo4[0] = -43;
		velocidadEnemigo4[1] = 84;
		velocidadEnemigo4[2] = -4;
		enemy4.getComportamiento().setVectorDeVelocidad(velocidadEnemigo4);

	}

}
